package com.juneng.common;

import com.baomidou.mybatisplus.extension.api.IErrorCode;
import com.juneng.constant.Constant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

/**
 * 统一API响应结果封装
 *
 * @author zds
 */
@Getter
@Setter
@ToString
@ApiModel(description = "返回信息")
@NoArgsConstructor
public class R<T> implements Serializable {

	@ApiModelProperty(value = "结果状态码：200成功 500操作失败 401暂未登录或token已经过期 403没有相关权限 404参数检验失败")
	private long code;
	@ApiModelProperty(value = "信息提示")
	private String message;
	@ApiModelProperty(value = "数据")
	private T data;

	public R(long code, String message, T data) {
		  this.code = code;
		  this.message = message;
		  this.data = data;
	}

	/**
	 * 成功返回结果
	 *
	 * @param data 获取的数据
	 */
	public static <T> R<T> success(T data) {
		return new R<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
	}

	/**
	 * 成功返回结果
	 *
	 * @param data    获取的数据
	 * @param message 提示信息
	 */
	public static <T> R<T> success(T data, String message) {
		return new R<T>(ResultCode.SUCCESS.getCode(), message, data);
	}

	/**
	 * 失败返回结果
	 *
	 * @param errorCode 错误码
	 */
	public static <T> R<T> failed(ResultCode errorCode) {
		return new R<T>(errorCode.getCode(), errorCode.getMessage(), null);
	}

	/**
	 * 失败返回结果
	 *
	 * @param errorCode 错误码
	 * @param message   错误信息
	 */
	public static <T> R<T> failed(IErrorCode errorCode, String message) {
		return new R<T>(errorCode.getCode(), message, null);
	}

	/**
	 * 失败返回结果
	 *
	 * @param message 提示信息
	 */
	public static <T> R<T> failed(String message) {
		return new R<T>(ResultCode.UNAUTHORIZED.getCode(), message, null);
	}

	/**
	 * 失败返回结果
	 */
	public static <T> R<T> failed() {
		return failed(ResultCode.FORBIDDEN);
	}

	/**
	 * 参数验证失败返回结果
	 */
	public static <T> R<T> validateFailed() {
		return failed(ResultCode.VALIDATE_FAILED);
	}

	/**
	 * 参数验证失败返回结果
	 *
	 * @param message 提示信息
	 */
	public static <T> R<T> validateFailed(String message) {
		return new R<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
	}

	/**  音频
	 * 未登录返回结果
	 */
	public static <T> R<T> unauthorized(T data) {
		return new R<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
	}

	/**
	 * 未授权返回结果
	 */
	public static <T> R<T> forbidden(T data) {
		return new R<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
	}

}
